Pressidian
花园入口
笔记
项目
关于
实验室
GitHub
花园入口
笔记
项目
关于
实验室
GitHub

KNOWLEDGE PATHS

笔记库
当前位置
笔记库/前端/面试/八股/JS

Call、Apply与Bind的区别 ⌚️

2 分钟阅读 · Note

目录树 578 篇

            • 代码运行过程
            • 深拷贝使用json化的问题 ⌚️
            • 暂时性死区 ⌚️
            • Call、Apply与Bind的区别 ⌚️
            • Iterable&Enumerable
            • JS
            • label
            • Realm
            • var、let、const的区别 ⌚️
          • 进阶篇题目列表
          • DOM&浏览器 API
          • HTTP&网络
          • TS
          • Vue
        • 可投递企业
      • 前端技术栈
    • 笔记目录
    • CLAUDE.md
    • Vue 组件与 Render 函数

关联笔记 6

↗代码运行过程同一路径↗深拷贝使用json化的问题 ⌚️同一路径↗暂时性死区 ⌚️同一路径↗Iterable&Enumerable同一路径↗JS同一路径↗label同一路径

call、apply、bind 都是 JavaScript 中用来显式改变函数运行时 this 指向的方法,它们都定义在 Function.prototype 上。三者的核心区别在于调用方式和传参形式。


1. call

  • 立即执行函数。
  • 第一个参数是 this 要指向的对象,后面的参数逐个传递。
func.call(thisArg, arg1, arg2, ...)

示例:

const obj = { name: 'Alice' };
function say(greeting, punctuation) {
  console.log(greeting + ', ' + this.name + punctuation);
}
say.call(obj, 'Hello', '!'); // Hello, Alice!

2. apply

  • 立即执行函数。
  • 第一个参数是 this 要指向的对象,第二个参数是一个数组(或类数组),里面包含所有参数。
func.apply(thisArg, [arg1, arg2, ...])

示例:

say.apply(obj, ['Hi', '?']); // Hi, Alice?
  • 经典使用场景:借用 Math.max 处理数组。
Math.max.apply(null, [1, 5, 3]); // 5

3. bind

  • 不会立即执行,而是返回一个绑定了 this 的新函数。
  • 可以预设部分参数(柯里化),在真正调用时再传入剩余参数。
const boundFunc = func.bind(thisArg, arg1, arg2, ...)
boundFunc(restArgs...)

示例:

const sayToAlice = say.bind(obj, 'Hey');
sayToAlice('!!'); // Hey, Alice!!
  • 典型使用场景:事件回调中固定 this,或延迟执行。
const user = {
  name: 'Bob',
  greet() { console.log('Hi, ' + this.name); }
};
setTimeout(user.greet.bind(user), 1000);

核心区别对比

特性callapplybind
是否立即执行✅ 是✅ 是❌ 否,返回新函数
参数传递方式逐个传入 (comma-separated)以数组形式传入可分批传入(预设+剩余)
返回值函数执行结果函数执行结果绑定了 this 的新函数
典型场景明确参数个数时借用方法参数已经是数组(如 Math.max)回调、事件监听、偏函数

简单记忆:

  • call —— Comma(逗号)传参,立即执行。
  • apply —— Array(数组)传参,立即执行。
  • bind —— Bind 之后不立即执行,返回新函数,传参类似 call。